#!/bin/bash
# ============================================================================
# 安装 GLIBC 2.25（非系统路径，相对安全）
# ============================================================================
#
# ⚠️⚠️⚠️ 重要警告 ⚠️⚠️⚠️
#
# 升级系统 GLIBC 是极其危险的操作！
# - GLIBC 是系统核心库，几乎所有程序都依赖它
# - 直接替换系统 GLIBC 可能导致系统无法启动
# - 可能导致其他程序不兼容
#
# 本脚本采用相对安全的方法：
# - 在非系统路径安装 GLIBC 2.25（/opt/glibc-2.25）
# - 不替换系统 GLIBC
# - 使用 LD_LIBRARY_PATH 或 LD_PRELOAD 来使用新版本
#
# 强烈建议：
# - 优先使用 Firefox 浏览器（不需要 GLIBC 2.25）
# - 或使用兼容版本的 Chrome 114.x
# - 或升级到 CentOS 8+ / Rocky Linux / AlmaLinux
#
# 使用方法：
#   sudo ./tools/install_glibc_2.25.sh
#
# 注意事项：
#   - 需要 root 权限
#   - 需要编译工具（gcc, make 等）
#   - 编译时间较长（30-60 分钟）
#   - 需要足够的磁盘空间（至少 2GB）
#
# ============================================================================

set -e
set -u

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
BOLD='\033[1m'
NC='\033[0m'

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_danger() {
    echo -e "${RED}${BOLD}[危险]${NC} $1"
}

# 显示警告
show_warning() {
    echo ""
    log_danger "════════════════════════════════════════════════════════════"
    log_danger "                    ⚠️  严重警告  ⚠️"
    log_danger "════════════════════════════════════════════════════════════"
    echo ""
    log_danger "升级 GLIBC 是极其危险的操作！"
    echo ""
    log_warning "风险："
    log_warning "  • 可能导致系统无法启动"
    log_warning "  • 可能导致其他程序不兼容"
    log_warning "  • 可能导致系统不稳定"
    echo ""
    log_info "本脚本采用相对安全的方法："
    log_info "  • 在非系统路径安装（/opt/glibc-2.25）"
    log_info "  • 不替换系统 GLIBC"
    log_info "  • 使用环境变量来使用新版本"
    echo ""
    log_warning "强烈建议的替代方案："
    log_warning "  1. 使用 Firefox 浏览器（推荐）"
    log_warning "     sudo ./tools/install_browser_centos7.sh firefox"
    log_warning "  2. 使用兼容版本的 Chrome 114.x"
    log_warning "     sudo ./tools/install_browser_centos7.sh chrome"
    log_warning "  3. 升级到 CentOS 8+ / Rocky Linux / AlmaLinux"
    echo ""
    log_danger "════════════════════════════════════════════════════════════"
    echo ""
    
    read -p "是否继续安装 GLIBC 2.25? (输入 'YES' 继续): " -r
    echo
    if [ "$REPLY" != "YES" ]; then
        log_info "已取消安装"
        log_info "建议使用: sudo ./tools/install_browser_centos7.sh firefox"
        exit 0
    fi
}

# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
    log_error "此脚本需要 root 权限"
    log_info "请使用: sudo $0"
    exit 1
fi

# 显示警告
show_warning

# 检查系统类型
if [ ! -f /etc/redhat-release ]; then
    log_error "此脚本仅适用于 CentOS/RHEL 系统"
    exit 1
fi

log_info "=========================================="
log_info "安装 GLIBC 2.25（非系统路径）"
log_info "=========================================="
log_info ""

# 检查当前 GLIBC 版本
log_info "检查当前 GLIBC 版本..."
CURRENT_GLIBC=$(ldd --version 2>&1 | head -n1 | grep -oP '\d+\.\d+' | head -n1 || echo "未知")
log_info "当前 GLIBC 版本: $CURRENT_GLIBC"

if [ "$CURRENT_GLIBC" != "未知" ]; then
    GLIBC_MAJOR=$(echo $CURRENT_GLIBC | cut -d. -f1)
    GLIBC_MINOR=$(echo $CURRENT_GLIBC | cut -d. -f2)
    
    if [ "$GLIBC_MAJOR" -gt 2 ] || ([ "$GLIBC_MAJOR" -eq 2 ] && [ "$GLIBC_MINOR" -ge 25 ]); then
        log_success "✅ GLIBC 版本已满足要求（$CURRENT_GLIBC >= 2.25）"
        log_info "无需安装"
        exit 0
    fi
fi

# 安装路径
GLIBC_PREFIX="/opt/glibc-2.25"
BUILD_DIR="/tmp/glibc-2.25-build"

# 检查是否已安装
if [ -d "$GLIBC_PREFIX" ] && [ -f "$GLIBC_PREFIX/lib/libc.so.6" ]; then
    log_warning "检测到已安装的 GLIBC 2.25: $GLIBC_PREFIX"
    read -p "是否重新安装? (y/N): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        log_info "已取消"
        log_info "使用方式: export LD_LIBRARY_PATH=$GLIBC_PREFIX/lib:\$LD_LIBRARY_PATH"
        exit 0
    fi
    log_info "清理旧安装..."
    rm -rf "$GLIBC_PREFIX"
fi

# 安装编译依赖
log_info "步骤 1/5: 安装编译依赖..."
yum groupinstall -y "Development Tools" >/dev/null 2>&1 || true
yum install -y gcc gcc-c++ make bison wget texinfo >/dev/null 2>&1 || true

# 检查磁盘空间（至少需要 2GB）
log_info "检查磁盘空间..."
AVAILABLE_SPACE=$(df /tmp | tail -1 | awk '{print $4}')
if [ "$AVAILABLE_SPACE" -lt 2097152 ]; then  # 2GB in KB
    log_error "磁盘空间不足（需要至少 2GB）"
    log_info "可用空间: $(($AVAILABLE_SPACE / 1024))MB"
    exit 1
fi

# 下载 GLIBC 2.25 源码
log_info "步骤 2/5: 下载 GLIBC 2.25 源码..."
cd /tmp
GLIBC_VERSION="2.25"
GLIBC_TARBALL="glibc-${GLIBC_VERSION}.tar.xz"
GLIBC_URL="https://ftp.gnu.org/gnu/glibc/glibc-${GLIBC_VERSION}.tar.xz"

if [ ! -f "$GLIBC_TARBALL" ]; then
    log_info "下载中（这可能需要一些时间）..."
    if ! wget "$GLIBC_URL" 2>&1; then
        log_error "下载失败"
        log_info "尝试使用镜像源..."
        GLIBC_URL_MIRROR="https://mirrors.tuna.tsinghua.edu.cn/gnu/glibc/glibc-${GLIBC_VERSION}.tar.xz"
        if ! wget "$GLIBC_URL_MIRROR" 2>&1; then
            log_error "下载失败，请检查网络连接"
            exit 1
        fi
    fi
else
    log_info "发现已存在的文件: $GLIBC_TARBALL"
fi

# 解压源码
log_info "步骤 3/5: 解压源码..."
if [ -d "glibc-${GLIBC_VERSION}" ]; then
    rm -rf "glibc-${GLIBC_VERSION}"
fi
tar -xf "$GLIBC_TARBALL"

# 创建构建目录
if [ -d "$BUILD_DIR" ]; then
    rm -rf "$BUILD_DIR"
fi
mkdir -p "$BUILD_DIR"
cd "$BUILD_DIR"

# 配置编译选项
log_info "步骤 4/5: 配置编译选项..."
log_warning "⚠️  编译过程可能需要 30-60 分钟，请耐心等待..."

../glibc-${GLIBC_VERSION}/configure \
    --prefix="$GLIBC_PREFIX" \
    --enable-kernel=2.6.32 \
    --with-headers=/usr/include \
    --disable-profile \
    --enable-add-ons \
    --with-tls \
    --enable-shared \
    --enable-obsolete-rpc \
    >/dev/null 2>&1 || {
    log_error "配置失败"
    exit 1
}

# 编译（使用所有 CPU 核心）
log_info "编译中（使用 $(nproc) 个 CPU 核心）..."
if ! make -j$(nproc) 2>&1 | tee /tmp/glibc-build.log | grep -E "(error|Error|ERROR)" | head -20; then
    # 检查是否有错误
    if grep -q "error" /tmp/glibc-build.log; then
        log_error "编译失败，请查看日志: /tmp/glibc-build.log"
        exit 1
    fi
fi

# 安装
log_info "步骤 5/5: 安装到 $GLIBC_PREFIX..."
make install >/dev/null 2>&1 || {
    log_error "安装失败"
    exit 1
}

# 验证安装
log_info "验证安装..."
if [ -f "$GLIBC_PREFIX/lib/libc.so.6" ]; then
    INSTALLED_VERSION=$($GLIBC_PREFIX/lib/libc.so.6 2>&1 | head -n1 | grep -oP '\d+\.\d+' | head -n1 || echo "未知")
    log_success "✅ GLIBC 2.25 安装成功"
    log_info "安装路径: $GLIBC_PREFIX"
    log_info "版本: $INSTALLED_VERSION"
else
    log_error "❌ 安装验证失败"
    exit 1
fi

# 创建使用脚本
log_info "创建使用脚本..."
cat > /usr/local/bin/use-glibc-2.25.sh <<EOF
#!/bin/bash
# 使用 GLIBC 2.25 运行程序
# 使用方法: source /usr/local/bin/use-glibc-2.25.sh
# 或: /usr/local/bin/use-glibc-2.25.sh <command>

export LD_LIBRARY_PATH=/opt/glibc-2.25/lib:\$LD_LIBRARY_PATH

if [ \$# -gt 0 ]; then
    exec "\$@"
fi
EOF

chmod +x /usr/local/bin/use-glibc-2.25.sh

# 清理构建文件
log_info "清理构建文件..."
rm -rf "$BUILD_DIR"
rm -rf "/tmp/glibc-${GLIBC_VERSION}"

# 完成
log_info ""
log_info "=========================================="
log_success "✅ 安装完成！"
log_info "=========================================="
log_info ""
log_info "使用方式："
log_info ""
log_info "方法 1: 使用脚本（推荐）"
log_info "  source /usr/local/bin/use-glibc-2.25.sh"
log_info "  google-chrome  # 或其他需要 GLIBC 2.25 的程序"
log_info ""
log_info "方法 2: 直接设置环境变量"
log_info "  export LD_LIBRARY_PATH=/opt/glibc-2.25/lib:\$LD_LIBRARY_PATH"
log_info "  google-chrome"
log_info ""
log_info "方法 3: 运行单个命令"
log_info "  /usr/local/bin/use-glibc-2.25.sh google-chrome"
log_info ""
log_warning "⚠️  注意："
log_warning "  • 不要替换系统 GLIBC（/lib64/libc.so.6）"
log_warning "  • 只在需要时使用 LD_LIBRARY_PATH"
log_warning "  • 建议优先使用 Firefox 浏览器"
log_info ""

